LLM 代码组成结构 — 以 DeepSeek 为例
大语言模型(Large Language Model,LLM)的代码由多个层次组成:从底层的 GPU 算子内核、分布式通信库、存储基础设施,到模型定义、训练框架、推理加速和对外 API 服务。本文以 DeepSeek-V3(671B MoE,37B 激活/Token)及其开源生态为例,用 UML 图系统梳理 LLM 代码的全栈架构。
第一部分:行为图(系统做什么)
从用例到主流程再到交互细节,逐步细化
1.1 用例图 — LLM 全生命周期
LLM 涉及四类主要参与者:算法工程师(算法工程师)负责训练微调,系统工程师(系统工程师)负责集群与部署,应用开发者(应用开发者)通过 API 集成,最终用户使用 Chat 产品。
专有名词:
- SFT(Supervised Fine-Tuning,有监督微调):使用高质量指令-回答数据训练基础模型,使其学会遵循指令
- RLHF/GRPO(Reinforcement Learning from Human Feedback / Group Relative Policy Optimization,人类反馈强化学习/组相对策略优化):用于对齐模型行为,GRPO 是 DeepSeek 采用的替代 PPO 的高效 RL 方法
- 量化(Quantization,量化):将模型参数从高精度(如 FP32/BF16)压缩到低精度(如 FP8/INT8),减少显存和计算量
1.2 活动图 — 训练主流程
一次完整的 LLM 训练经过三个阶段:预训练(从零学习语言能力)、SFT 微调(学习指令遵循)、RL 对齐(学习偏好对齐)。
专有名词:
- Tokenization(分词):将原始文本切分为 token 序列。DeepSeek-V3 使用 Byte-level BPE(字节级字节对编码),词汇量约 100K
- All-Reduce(全归约):分布式训练中同步梯度的集合通信操作,所有 GPU 的梯度求平均后广播给每张卡
- AdamW(Adam with Weight Decay):深度学习优化器,在 Adam 基础上加入权重衰减正则化
- FP8 混合精度训练(FP8 Mixed Precision Training):DeepSeek-V3 首次在超大规模模型验证了 FP8 训练的可行性,大幅降低显存与通信带宽
1.3 活动图 — 推理主流程
推理分为两个阶段:Prefill(预填充)一次性处理全部输入 prompt,生成 KV Cache;Decode(逐 token 生成)自回归逐 token 输出。
专有名词:
- Prefill(预填充):将用户 prompt 的所有 token 一次送入模型,计算所有层注意力并生成初始 KV Cache。此阶段为 compute-bound,并行度高
- Decode(解码):每次生成一个 token,将新 token 的 KV 追加到缓存。此阶段为 memory-bound,瓶颈在从 HBM 读取 KV Cache 的带宽
- KV Cache(Key-Value 缓存):缓存前文每个 token 的 Key 和 Value 向量,避免重复计算。DeepSeek 使用 FP8 KV Cache 压缩存储(每 token 656 字节)
- Top-P / Temperature(核采样 / 温度):采样策略。Top-P 从累积概率达到 p 的 token 中采样;Temperature 控制概率分布平滑度
1.4 时序图 — MoE 路由与 Token 调度
MoE(Mixture of Experts)是 DeepSeek-V3 的核心架构:每层有 256 个专家,每个 token 只激活 8 个。路由通过 DeepEP 实现跨 GPU 的 token 分发(Dispatch)与汇总(Combine)。
专有名词:
- MoE(Mixture of Experts,混合专家):每层有多个(256)独立 FFN 专家,每个 token 只激活少数(8)个。相比 Dense 模型,总参数量可数倍增长而计算量基本不变
- Expert Parallelism(EP,专家并行):将不同专家分布在不同 GPU 节点上。DeepEP 提供高效的 All-to-All 通信内核
- 辅助无损负载均衡(Auxiliary-Loss-Free Load Balancing):DeepSeek-V3 首创,在路由中动态调整偏置使专家负载均匀,无需额外损失项
- RDMA(Remote Direct Memory Access,远程直接内存访问):允许跨节点 GPU 直接读写对方显存,绕过 CPU。通过 InfiniBand 实现
1.5 时序图 — 自回归推理生成
从用户发送 prompt 到最终返回生成结果,经历 Prefill、多轮 Decode(支持 MTP 投机解码加速)等阶段。
专有名词:
- MTP(Multi-Token Prediction,多 token 预测):DeepSeek-V3 在训练时预测后续多个 token(而非仅下一个),推理时可复用为投机解码加速
- 投机解码(Speculative Decoding):用 draft model 快速生成多个候选 token,再由大模型(target model)并行验证接受。DeepSpec 实现了 DSpark/DFlash/Eagle3 算法
- DSA(DeepSeek Sparse Attention,DeepSeek 稀疏注意力):DeepSeek-V3.2 引入的 token 级稀疏注意力,在 Decode 阶段只关注与当前 token 最相关的 top-k 个历史 token
- SSE(Server-Sent Events,服务器推送事件):实现 LLM 流式输出的标准协议
- 张量并行(Tensor Parallelism,TP):将单层权重切分到多张 GPU 上并行计算,通过 All-Reduce 同步结果
1.6 状态机图 — 模型生命周期
LLM 模型从研发到部署经历多个状态转换。
专有名词:
- Base Model(基座模型):仅经过预训练的基础模型,具备语言知识和推理能力但不会对话,需 SFT/RL 才能作为 Chat 模型使用
- Reward Model(奖励模型):用于 RL 阶段,评估模型回答好坏并输出奖励分数,指导策略优化
第二部分:结构图(系统由什么组成)
从宏观架构递进到内部细节、物理部署
2.1 组件图 — LLM 代码整体架构总览
LLM 代码按层次分为模型层、计算内核层、通信层、存储层、框架层、服务层六大模块。
专有名词:
- MLA(Multi-head Latent Attention,多头潜在注意力):DeepSeek 的核心注意力创新。通过低秩压缩 KV Cache(576 维 latent 空间 vs 传统 MHA 的完整 K/V),大幅降低推理显存
- DeepSeekMoE:DeepSeek 的 MoE 实现,包含共享专家(shared experts)+ 路由专家(routed experts)。每个 token 固定激活所有共享专家 + top-k 路由专家
- DSA Indexer(DeepSeek Sparse Attention Indexer):用于稀疏注意力的闪电索引器,快速计算 token 间相关性分数,筛选 top-k 关键 token
2.2 包图 — DeepSeek 开源仓库依赖关系
DeepSeek 将 LLM 代码拆分为多个独立的 GitHub 仓库,每个聚焦一个子系统。
以下是用 Python 调用这些核心库的 Demo 代码:
# === 1. FlashMLA: Dense Decode (推理中最频繁的操作) ===
from flash_mla import get_mla_metadata, flash_mla_with_kvcache
# 获取 tile scheduler 元数据(推理循环前调用一次)
tile_metadata, num_splits = get_mla_metadata(
cache_seqlens, s_q=1, h_q=128, h_kv=1, is_fp8=False, topk=0
)
# Decode 循环中每层调用
for layer_idx in range(num_layers):
attn_out, lse = flash_mla_with_kvcache(
queries[layer_idx], kv_cache[layer_idx],
block_table, cache_seqlens, head_dim_v,
tile_metadata, num_splits, is_causal=True
)
# === 2. DeepGEMM: MoE Expert 的 GEMM 计算 ===
import deep_gemm
# 连续布局的 Grouped GEMM(MoE 训练/Prefill)
y = deep_gemm.m_grouped_fp8_gemm_nt_contiguous(x, weights, m_indices)
# FP8 标准 GEMM for Attention QKV projection
out = deep_gemm.fp8_gemm_nt(q, k_weight) # D = C + A @ B.T
# === 3. DeepEP: MoE 的 All-to-All Dispatch & Combine ===
from deep_ep import ElasticBuffer
buffer = ElasticBuffer(group, num_max_tokens_per_rank=8192, hidden=7168, num_topk=8)
# Dispatch: 将 token 分发到对应 expert 所在的 GPU
recv_x, recv_idx, recv_weights, handle, event = buffer.dispatch(
hidden_states, topk_idx=topk_idx, topk_weights=topk_weights,
num_experts=256, num_sms=6, async_with_compute_stream=True
)
event.current_stream_wait() # 等待通信完成
# 本地计算 Expert GEMM 后 ... Combine: 汇总还原
combined, event = buffer.combine(expert_outputs, handle=handle,
num_sms=6, async_with_compute_stream=True)
# === 4. 3FS: 高吞吐 Checkpoint 读写 ===
# 通过 FUSE 挂载,以标准文件接口读写(无需特殊 API)
# 支持 180 存储节点、6.6 TiB/s 聚合读取吞吐
# === 5. DeepSpec: 投机解码加速 ===
# bash scripts/eval/eval.sh
# 使用 draft model 快速预测多个候选 token,target model 并行验证
# DSpark / DFlash / Eagle3 三种算法,可加速 1.5x-2x
2.3 组件图 — Transformer Block 内部结构
DeepSeek-V3 共 61 个 Transformer 层,每层由 MLA Attention + DeepSeekMoE FFN 组成,额外附带 MTP 模块用于多 token 预测。
专有名词:
- RMSNorm(Root Mean Square Normalization,RMS 归一化):相比 LayerNorm 去掉平移参数仅做缩放,计算更高效,LLaMA/DeepSeek 系列标配
- RoPE(Rotary Position Embedding,旋转位置编码):通过对 Q/K 向量做旋转操作编码位置信息,具有远程衰减和相对位置感知特性
- Residual Connection(残差连接):每层输出 = 输入 + 层计算结果,保证梯度传播,是大模型训练稳定的关键
- Shared Expert(共享专家):所有 token 必须经过的 Expert,与 Routed Expert 并行计算后相加,确保基础能力不因稀疏路由而丢失
2.4 部署图 — 分布式训练集群
DeepSeek-V3 使用 2048 块 H800 GPU 进行预训练,采用 EP + TP + DP 三维并行策略,底层靠 3FS 做共享存储,InfiniBand 做跨节点互联。
专有名词:
- 数据并行(Data Parallelism,DP):每张卡持有完整模型副本,处理不同 batch 数据,梯度通过 All-Reduce 同步
- ZeRO-1(Zero Redundancy Optimizer Stage 1):将优化器状态分片到不同 GPU 上,减少显存冗余
- 计算-通信重叠(Computation-Communication Overlap):DeepEP V2 在后台执行 All-to-All 通信的同时 GPU 做前向计算,通过 CUDA stream 同步实现流水线
2.5 部署图 — 推理服务架构
推理阶段通过 SGLang/vLLM 等推理引擎管理 KV Cache 分页、Continuous Batching 和多 GPU 张量并行。
专有名词:
- PagedAttention(分页注意力):将 KV Cache 按页(block)管理,类似 OS 虚拟内存分页。消除显存碎片,显著提高吞吐量
- Continuous Batching(连续批处理):请求到达和完成时可以动态加入/移除,不阻塞其他请求
- KV Cache Offloading(KV Cache 卸载):将不活跃的 KV Cache 从 GPU 显存卸载到 3FS 分布式存储,需要时再加载回来。大幅降低推理显存成本
- PD Separation(Prefill-Decode Disaggregation):将 Prefill 和 Decode 分离到不同机器,分别针对 compute-bound 和 memory-bound 优化
附录:DeepSeek 开源仓库速查表
| 仓库 | 功能 | 语言 | Stars | 许可 |
|---|---|---|---|---|
| DeepSeek-V3 | 模型权重、推理 Demo、配置 | Python | 104k+ | MIT |
| FlashMLA | MLA 注意力内核(Prefill / Decode / Sparse) | C++/CUDA | 12.8k | MIT |
| DeepGEMM | GEMM 内核(FP8/BF16/FP4)、Mega MoE、DSA Indexer | CUDA/C++ | 7.6k | MIT |
| DeepEP | Expert Parallel 通信(All-to-All Dispatch / Combine) | CUDA/C++ | 9.9k | MIT |
| 3FS | 分布式文件系统(数据 / Checkpoint / KVCache) | C++/Rust | 10.1k | MIT |
| DeepSpec | 投机解码训练与评估(DSpark/DFlash/Eagle3) | Python | 6.8k | MIT |
| TileKernels | TileLang 内核库 | Python | 1.7k | MIT |
附录:持久化与数据库体系
DeepSeek 使用了三层数据库体系支撑从训练到推理的全生命周期数据持久化。训练过程中产生的所有持久化 entity 最终落盘在 3FS 分布式文件系统上。
数据库分层
| 数据库 | 层级 | 存储内容 | 特点 |
|---|---|---|---|
| FoundationDB | 文件系统元数据 | inode(文件/目录/软链接属性)、目录项(DENT)、文件 chunk layout(chain table 分配、shuffle seed、chunk size、stripe size) | 事务型 KV 存储,Serializable Snapshot Isolation;多个 stateless meta service 并行读写,冲突自动重试 |
| RocksDB | 每 SSD 本地 chunk 引擎 | chunk ID → physical block 映射、chunk 版本号(committed/pending)、chain version 标记 | 嵌入式 KV,配合内存 hashmap cache;chunk 更新走 Copy-on-Write,commit 时原子写入 |
| ZooKeeper / etcd | 集群协调 | chain table 配置、membership 状态、主备选举 | 也可复用 FoundationDB 替代 |
训练后持久化的 Entity
| Entity | 存储介质 | 大小/说明 |
|---|---|---|
| Model Checkpoint | 3FS chunk (SSD × 3 副本) | 模型权重 + AdamW optimizer states(momentum / variance)+ 训练步数 + 随机种子。每个 checkpoint 数百 GB 级 |
| 最终模型权重 | 3FS → 发布至 HuggingFace | DeepSeek-V3 约 685B(671B MoE + 14B MTP),FP8 格式 .safetensors |
| 训练日志 / TensorBoard | 3FS 文件 | loss 曲线、每步指标、benchmark 评测结果 |
| 训练数据集 | 3FS 文件 | 14.8T tokens 预处理后的 tokenized 二进制数据。多个训练节点通过 3FS FUSE 随机读取样本 |
| 文件元数据 | FoundationDB | inode(64-bit 单调递增 ID)+ 目录项。meta service 通过 round-robin + shuffle 给新文件分配 chain |
附录:开源权重与数据库的关系
| 开源内容(已公开) | 未公开内容 | |
|---|---|---|
| 模型层 | 模型权重 .safetensors 文件(685B)、推理 Demo 代码、配置文件 |
训练框架完整代码(仅公开了推理/转换部分) |
| 内核层 | FlashMLA、DeepGEMM、DeepEP、3FS、DeepSpec、TileKernels | — |
| 数据层 | — | 14.8T tokens 训练数据集、数据清洗 pipeline、分词器训练数据 |
| 训练产物 | 最终权重 | 中间 checkpoint、optimizer states、训练日志、loss 曲线 |
| 数据库 | — | FoundationDB 中的 inode/目录项、RocksDB 中的 chunk 元数据、ZooKeeper 中的集群配置 |
打个比方:开源权重相当于公开了"一幅已经画好的画",但不等于公开了"颜料配方、画布供应商、工作室钥匙、每一版草稿"(训练数据、数据库、infra 配置、中间 checkpoint)。